home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / TCP.H < prev    next >
C/C++ Source or Header  |  1990-08-10  |  6KB  |  176 lines

  1. /* TCP implementation. Follows RFC 793 as closely as possible */
  2.  
  3. #define DEF_WND 2048    /* Default receiver window */
  4. #define NTCB    19    /* # TCB hash table headers */
  5. #define DEF_MSS 512    /* Default maximum segment size */
  6. #define DEF_RTT 5000    /* Initial guess at round trip time (5 sec) */
  7. #define MSL2    30    /* Guess at two maximum-segment lifetimes */
  8. #define TIMOUT    7200    /* Timeout on transient states (SYN Rcvd) */
  9. /* Round trip timing parameters */
  10. #define AGAIN    8    /* Average RTT gain = 1/8 */
  11. #define DGAIN    4    /* Mean deviation gain = 1/4 */
  12.  
  13. /* TCP segment header -- internal representation
  14.  * Note that this structure is NOT the actual header as it appears on the
  15.  * network (in particular, the offset and checksum fields are missing).
  16.  * All that knowledge is in the functions ntohtcp() and htontcp() in tcpsubr.c
  17.  */
  18. struct tcp {
  19.     int16 source;    /* Source port */
  20.     int16 dest;    /* Destination port */
  21.     int32 seq;    /* Sequence number */
  22.     int32 ack;    /* Acknowledgment number */
  23.     char flags;    /* Flags, data offset */
  24. #define URG    0x20    /* URGent flag */
  25. #define ACK    0x10    /* ACKnowledgment flag */
  26. #define PSH    0x08    /* PuSH flag */
  27. #define RST    0x04    /* ReSeT flag */
  28. #define SYN    0x02    /* SYNchronize flag */
  29. #define FIN    0x01    /* FINal flag */
  30.     int16 wnd;    /* Receiver flow control window */
  31.     int16 up;    /* Urgent pointer */
  32.     int16 mss;    /* Optional max seg size */
  33. };
  34. /* TCP options */
  35. #define EOL_KIND    0
  36. #define NOOP_KIND    1
  37. #define MSS_KIND    2
  38.  
  39. #define TCPLEN        20
  40. #define MSS_LENGTH    4
  41. /* Resequencing queue entry */
  42. struct reseq {
  43.     struct reseq *next;    /* Linked-list pointer */
  44.     char tos;        /* Type of service */
  45.     struct tcp seg;        /* TCP header */
  46.     struct mbuf *bp;    /* data */
  47.     int16 length;        /* data length */
  48. };
  49. #define NULLRESEQ    (struct reseq *)0
  50.  
  51. /* TCP connection control block */
  52. struct tcb {
  53.     struct tcb *prev;    /* Linked list pointers for hash table */
  54.     struct tcb *next;
  55.  
  56.     struct connection conn;
  57.  
  58.     char state;    /* Connection state */
  59. #define CLOSED        0    /* Must be 0 */
  60. #define LISTEN        1
  61. #define SYN_SENT    2
  62. #define SYN_RECEIVED    3
  63. #define ESTABLISHED    4
  64. #define FINWAIT1    5
  65. #define FINWAIT2    6
  66. #define CLOSE_WAIT    7
  67. #define CLOSING        8
  68. #define LAST_ACK    9
  69. #define TIME_WAIT    10
  70.  
  71.     char reason;        /* Reason for closing */
  72. #define NORMAL        0    /* Normal close */
  73. #define RESET        1    /* Reset by other end */
  74. #define TIMEOUT        2    /* Excessive retransmissions */
  75. #define NETWORK        3    /* Network problem (ICMP message) */
  76.  
  77. /* If reason == NETWORK, the ICMP type and code values are stored here */
  78.     char type;
  79.     char code;
  80.  
  81.     /* Send sequence variables */
  82.     struct {
  83.         int32 una;    /* First unacknowledged sequence number */
  84.         int32 nxt;    /* Next sequence num to be sent for the first time */
  85.         int32 ptr;    /* Working transmission pointer */
  86.         int16 wnd;    /* Other end's offered receive window */
  87.         int16 up;    /* Send urgent pointer */
  88.         int32 wl1;    /* Sequence number used for last window update */
  89.         int32 wl2;    /* Ack number used for last window update */
  90.     } snd;
  91.     int32 iss;        /* Initial send sequence number */
  92.     int16 cwind;        /* Congestion window */
  93.     int16 ssthresh;        /* Slow-start threshold */
  94.     int32 resent;        /* Count of bytes retransmitted */
  95.  
  96.     /* Receive sequence variables */
  97.     struct {
  98.         int32 nxt;    /* Incoming sequence number expected next */
  99.         int16 wnd;    /* Our offered receive window */
  100.         int16 up;    /* Receive urgent pointer */
  101.     } rcv;
  102.     int32 irs;        /* Initial receive sequence number */
  103.     int16 mss;        /* Maximum segment size */
  104.     int32 rerecv;        /* Count of duplicate bytes received */
  105.  
  106.     int16 window;        /* Receiver window and send queue limit */
  107.  
  108.     char backoff;        /* Backoff interval */
  109.     void (*r_upcall)();    /* Call when "significant" amount of data arrives */
  110.     void (*t_upcall)();    /* Call when ok to send more data */
  111.     void (*s_upcall)();    /* Call when connection state changes */
  112.     char flags;        /* Control flags */
  113. #define FORCE    1        /* We owe the other end an ACK or window update */
  114. #define CLONE    2        /* Server-type TCB, cloned on incoming SYN */
  115. #define RETRAN    4        /* A retransmission has occurred */
  116. #define ACTIVE    8        /* TCB created with an active open */
  117. #define SYNACK    16        /* Our SYN has been acked */
  118.     char tos;        /* Type of service (for IP) */
  119.  
  120.     struct mbuf *rcvq;    /* Receive queue */
  121.     int16 rcvcnt;
  122.  
  123.     struct mbuf *sndq;    /* Send queue */
  124.     int16 sndcnt;        /* Number of unacknowledged sequence numbers on
  125.                  * send queue. NB: includes SYN and FIN, which don't
  126.                  * actually appear on sndq!
  127.                  */
  128.  
  129.  
  130.     struct reseq *reseq;    /* Out-of-order segment queue */
  131.     struct timer timer;    /* Retransmission timer */
  132.     struct timer timeout;    /* Transient state timer */
  133.     struct timer rtt_timer; /* Round trip timer */
  134.     int32 rttseq;        /* Sequence number being timed */
  135.     int32 srtt;        /* Smoothed round trip time, milliseconds */
  136.     int32 mdev;        /* Mean deviation, milliseconds */
  137.  
  138.     char *user;        /* User parameter (e.g., for mapping to an
  139.                  * application control block
  140.                  */
  141. };
  142. #define NULLTCB (struct tcb *)0
  143. /* TCP statistics counters */
  144. struct tcp_stat {
  145.     int16 runt;        /* Smaller than minimum size */
  146.     int16 checksum;        /* TCP header checksum errors */
  147.     int16 conout;        /* Outgoing connection attempts */
  148.     int16 conin;        /* Incoming connection attempts */
  149.     int16 resets;        /* Resets generated */
  150.     int16 bdcsts;        /* Bogus broadcast packets */
  151. };
  152. extern struct tcp_stat tcp_stat;
  153.  
  154. extern struct tcb *tcbs[];
  155. extern int32 iss();
  156. struct tcb *lookup_tcb();
  157. struct tcb *create_tcb();
  158. void rehash_tcb(),tcp_output(),tcp_input(),close_self(),dump_seg(),
  159.     setstate();
  160. struct mbuf *htontcp();
  161.  
  162. #if (defined(ATARI_ST) && defined(__TURBOC__))
  163. extern log_tcp(struct tcb *,char *,...);
  164. extern tprintf(struct tcb *,char *,...);
  165. #endif
  166.  
  167. /* TCP primitives */
  168. struct tcb *open_tcp();
  169. int send_tcp(),recv_tcp(),close_tcp(),del_tcp();
  170. void state_tcp(),tcp_dump();
  171.  
  172. extern int16 tcp_mss;
  173. extern int16 tcp_window;
  174. extern int32 tcp_irtt;
  175. extern int32 tcp_timout;
  176.